1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include <bits/stdc++.h> #define rep(i, x, y) for (int i = x; i <= y; i++) using namespace std;
typedef long long ll; const int mod = 998244353, N = 2e6 + 10, inv2 = (mod + 1) / 2; ll n, a[N], f[N], bit3[N];
ll quick_pow(ll a, ll b) { ll ret = 1; for (; b; b >>= 1) { if (b & 1) ret = ret * a % mod; a = a * a % mod; } return ret; }
void FWT_xor(ll a[], int n, int op) { rep(i, 1, n) rep(j, 0, (1 << n) - 1) if (!((j >> (i - 1)) & 1)) { ll x = a[j], y = a[j + (1 << (i - 1))]; a[j] = (x + y) % mod, a[j + (1 << (i - 1))] = (x - y + mod) % mod; if (op == -1) (a[j] *= inv2) %= mod, (a[j + (1 << (i - 1))] *= inv2) %= mod; } }
int main() { cin >> n; f[0] = n; bit3[0] = 1; rep(i, 1, n) { scanf("%lld", &a[i]); bit3[i] = bit3[i - 1] * 3 % mod; f[a[i]] += 2; } FWT_xor(f, 20, 1); ll inv4 = quick_pow(4, mod - 2); rep(i, 0, (1 << 20) - 1) { int k = ((3 * n - f[i] + mod) % mod) * inv4 % mod; f[i] = (k & 1 ? mod - bit3[n - k] : bit3[n - k]); } FWT_xor(f, 20, -1); printf("%lld\n", (f[0] - 1 + mod) % mod); return 0; }
|